{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3.2 线性回归模型评估"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3.2.1 模型评估的编程实现"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3.1.3 代码汇总 ：不同行业工作年限与收入的线性回归模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\ProgramFiles\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 24037 (\\N{CJK UNIFIED IDEOGRAPH-5DE5}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\ProgramFiles\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 40836 (\\N{CJK UNIFIED IDEOGRAPH-9F84}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\ProgramFiles\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 34218 (\\N{CJK UNIFIED IDEOGRAPH-85AA}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\ProgramFiles\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 27700 (\\N{CJK UNIFIED IDEOGRAPH-6C34}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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zJ07lyNHjjB58mRGjhyp0SMREREx1cJOPqe++OILAyj3M3z4cMMwzLIDjz32mBEbG2uEhoYal19+ubFlyxaHe5w4ccIYM2aMERUVZYSFhRmDBg0y9u7d69Dm8OHDxm233WZEREQYERERxm233Wbk5OQ4tPnll1+MgQMHGmFhYUZUVJQxZswY4+TJk259Hq+VHBARERGvcfX722IYhuHDzFan5OXlYbVasdlsGqESEREJEK5+f/vtmiYRERERf6LQJCIiIuIChSYRERERFyg0iYiIiLhAoUlERETEBQpNIiIiIi5QaBIRERFxgU8rgtc1pSWv8vLyfNwTERERcVXp93ZVpSsVmjzo6NGjALRs2dLHPRERERF3HT16FKvV6vR5VQT3oJKSEn777TciIiKwWCweu29eXh4tW7Zk3759dbbSeF3/jPp8ga+uf0Z9vsBX1z+jNz+fYRgcPXqU+Ph4goKcr1zSSJMHBQUF0aJFC6/dPzIysk7+h3C6uv4Z9fkCX13/jPp8ga+uf0Zvfb7KRphKaSG4iIiIiAsUmkRERERcoNAUAEJDQ3nssccIDQ31dVe8pq5/Rn2+wFfXP6M+X+Cr65/RHz6fFoKLiIiIuEAjTSIiIiIuUGgSERERcYFCk4iIiIgLFJpEREREXKDQFABeeOEF2rRpQ6NGjejSpQtff/21r7vkMV999RWDBw8mPj4ei8XCe++95+suecysWbO45JJLiIiIICYmhuuuu46dO3f6ulsetXDhQjp16mQvNpeUlMQnn3zi6255zaxZs7BYLEyYMMHXXfGYadOmYbFYHH5iY2N93S2P2r9/P8OGDaNZs2Y0btyYiy66iIyMDF93yyPOPvvscv/+LBYL99xzj6+75jGnTp3i4Ycfpk2bNoSFhXHOOefw+OOPU1JSUut9UWjyc++88w4TJkzgoYce4ptvvuGyyy5jwIAB7N2719dd84j8/HwuvPBCFixY4OuueNzq1au55557WLduHStXruTUqVMkJyeTn5/v6655TIsWLZg9ezabNm1i06ZN9O7dm2uvvZZt27b5umset3HjRl5++WU6derk66543AUXXEBWVpb9Z8uWLb7uksfk5OTQq1cvGjZsyCeffML27duZN28eTZo08XXXPGLjxo0O/+5WrlwJwI033ujjnnnOnDlzePHFF1mwYAE7duzgqaeeYu7cuTz//PO13xlD/Fq3bt2Mu+66y+Fahw4djAceeMBHPfIewFi2bJmvu+E1Bw8eNABj9erVvu6KVzVt2tR45ZVXfN0Njzp69KjRtm1bY+XKlcYVV1xhjB8/3tdd8pjHHnvMuPDCC33dDa+ZMmWKcemll/q6G7Vm/PjxxrnnnmuUlJT4uiseM3DgQOP22293uHb99dcbw4YNq/W+aKTJjxUWFpKRkUFycrLD9eTkZNasWeOjXkl12Ww2AKKionzcE+8oLi4mNTWV/Px8kpKSfN0dj7rnnnsYOHAgV199ta+74hW7du0iPj6eNm3acMstt/DTTz/5ukse88EHH9C1a1duvPFGYmJi6Ny5M4sWLfJ1t7yisLCQJUuWcPvtt3v00Hhfu/TSS/n888/54YcfAPj2229JT0/nmmuuqfW+6MBeP/b7779TXFxM8+bNHa43b96c7OxsH/VKqsMwDCZOnMill15KYmKir7vjUVu2bCEpKYmTJ09yxhlnsGzZMhISEnzdLY9JTU1l8+bNbNy40ddd8Yru3bvzxhtv0K5dOw4cOMCTTz5Jz5492bZtG82aNfN192rsp59+YuHChUycOJGpU6eyYcMGxo0bR2hoKH/5y1983T2Peu+998jNzWXEiBG+7opHTZkyBZvNRocOHQgODqa4uJgZM2Zw66231npfFJoCQNm/MRiGUaf+FlEfjBkzhu+++4709HRfd8Xj2rdvT2ZmJrm5uSxdupThw4ezevXqOhGc9u3bx/jx41mxYgWNGjXydXe8YsCAAfZ/7tixI0lJSZx77rn861//YuLEiT7smWeUlJTQtWtXZs6cCUDnzp3Ztm0bCxcurHOh6dVXX2XAgAHEx8f7uise9c4777BkyRLeeustLrjgAjIzM5kwYQLx8fEMHz68Vvui0OTHoqOjCQ4OLjeqdPDgwXKjT+K/xo4dywcffMBXX31FixYtfN0djwsJCeG8884DoGvXrmzcuJH58+fz0ksv+bhnNZeRkcHBgwfp0qWL/VpxcTFfffUVCxYsoKCggODgYB/20PPCw8Pp2LEju3bt8nVXPCIuLq5cgD///PNZunSpj3rkHb/88gufffYZ7777rq+74nH33XcfDzzwALfccgtghvtffvmFWbNm1Xpo0pomPxYSEkKXLl3suyFKrVy5kp49e/qoV+IqwzAYM2YM7777LqtWraJNmza+7lKtMAyDgoICX3fDI/r06cOWLVvIzMy0/3Tt2pXbbruNzMzMOheYAAoKCtixYwdxcXG+7opH9OrVq1ypjx9++IHWrVv7qEfe8dprrxETE8PAgQN93RWPO378OEFBjnElODjYJyUHNNLk5yZOnEhKSgpdu3YlKSmJl19+mb1793LXXXf5umsecezYMX788Uf74z179pCZmUlUVBStWrXyYc9q7p577uGtt97i/fffJyIiwj5iaLVaCQsL83HvPGPq1KkMGDCAli1bcvToUVJTU/nyyy9JS0vzddc8IiIiotwatPDwcJo1a1Zn1qZNnjyZwYMH06pVKw4ePMiTTz5JXl5erf8N3lvuvfdeevbsycyZM7npppvYsGEDL7/8Mi+//LKvu+YxJSUlvPbaawwfPpwGDere1/rgwYOZMWMGrVq14oILLuCbb77hmWee4fbbb6/9ztT6fj1x2z/+8Q+jdevWRkhIiHHxxRfXqS3rX3zxhQGU+xk+fLivu1ZjFX0uwHjttdd83TWPuf322+1/Ns8880yjT58+xooVK3zdLa+qayUHbr75ZiMuLs5o2LChER8fb1x//fXGtm3bfN0tj/rwww+NxMREIzQ01OjQoYPx8ssv+7pLHvXpp58agLFz505fd8Ur8vLyjPHjxxutWrUyGjVqZJxzzjnGQw89ZBQUFNR6XyyGYRi1H9VEREREAovWNImIiIi4QKFJRERExAUKTSIiIiIuUGgSERERcYFCk4iIiIgLFJpEREREXKDQJCIiIuIChSYRERERFyg0iYiIiLig7h1SIyJSTWvWrGH06NEVPte/f382bdrE77//XuHzGzZsICQkxJvdExEfU2gSEflDXl4e1113HdOmTXO4/vPPP/PAAw9w7NgxMjMzy73uyiuv9MmJ6yJSuzQ9JyIiIuIChSYRERERFyg0iYiIiLhAoUlERETEBQpNIiIiIi5QaBIRERFxgUKTiIiIiAsUmkRERERcoNAkIiIi4gKFJhEREREX6BgVEZE/WK1WPvroIz766KNyz/Xr14/c3Fy6du1a4WuDgvR3UJG6zmIYhuHrToiIiIj4O/3VSERERMQFCk0iIiIiLlBoEhEREXGBQpOIiIiICxSaRERERFyg0CQiIiLiAoUmERERERcoNImIiIi44P8Bc1dUfE6vyK8AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "系数a为:2497.1513476046875\n",
      "截距b为:10143.131966873783\n"
     ]
    }
   ],
   "source": [
    "# 1.读取数据\n",
    "import pandas\n",
    "df = pandas.read_excel('IT行业收入表.xlsx')\n",
    "X = df[['工龄']]\n",
    "Y = df['薪水']\n",
    "\n",
    "# 2.模型训练\n",
    "from sklearn.linear_model import LinearRegression\n",
    "regr = LinearRegression()\n",
    "regr.fit(X,Y)\n",
    "\n",
    "# 3.模型可视化\n",
    "from matplotlib import pyplot as plt\n",
    "plt.scatter(X,Y)\n",
    "plt.plot(X, regr.predict(X), color='red')  # color='red'设置为红色\n",
    "plt.xlabel('工龄')\n",
    "plt.ylabel('薪水')\n",
    "plt.show()\n",
    "\n",
    "# 4.线性回归方程构造\n",
    "print('系数a为:' + str(regr.coef_[0]))\n",
    "print('截距b为:' + str(regr.intercept_))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table class=\"simpletable\">\n",
       "<caption>OLS Regression Results</caption>\n",
       "<tr>\n",
       "  <th>Dep. Variable:</th>           <td>薪水</td>        <th>  R-squared:         </th> <td>   0.855</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Model:</th>                   <td>OLS</td>       <th>  Adj. R-squared:    </th> <td>   0.854</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Method:</th>             <td>Least Squares</td>  <th>  F-statistic:       </th> <td>   578.5</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Date:</th>             <td>Tue, 23 Apr 2024</td> <th>  Prob (F-statistic):</th> <td>6.69e-43</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Time:</th>                 <td>15:02:22</td>     <th>  Log-Likelihood:    </th> <td> -930.83</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>No. Observations:</th>      <td>   100</td>      <th>  AIC:               </th> <td>   1866.</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Df Residuals:</th>          <td>    98</td>      <th>  BIC:               </th> <td>   1871.</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Df Model:</th>              <td>     1</td>      <th>                     </th>     <td> </td>   \n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Covariance Type:</th>      <td>nonrobust</td>    <th>                     </th>     <td> </td>   \n",
       "</tr>\n",
       "</table>\n",
       "<table class=\"simpletable\">\n",
       "<tr>\n",
       "    <td></td>       <th>coef</th>     <th>std err</th>      <th>t</th>      <th>P>|t|</th>  <th>[0.025</th>    <th>0.975]</th>  \n",
       "</tr>\n",
       "<tr>\n",
       "  <th>const</th> <td> 1.014e+04</td> <td>  507.633</td> <td>   19.981</td> <td> 0.000</td> <td> 9135.751</td> <td> 1.12e+04</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>工龄</th>    <td> 2497.1513</td> <td>  103.823</td> <td>   24.052</td> <td> 0.000</td> <td> 2291.118</td> <td> 2703.185</td>\n",
       "</tr>\n",
       "</table>\n",
       "<table class=\"simpletable\">\n",
       "<tr>\n",
       "  <th>Omnibus:</th>       <td> 0.287</td> <th>  Durbin-Watson:     </th> <td>   0.555</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Prob(Omnibus):</th> <td> 0.867</td> <th>  Jarque-Bera (JB):  </th> <td>   0.463</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Skew:</th>          <td> 0.007</td> <th>  Prob(JB):          </th> <td>   0.793</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Kurtosis:</th>      <td> 2.667</td> <th>  Cond. No.          </th> <td>    9.49</td>\n",
       "</tr>\n",
       "</table><br/><br/>Notes:<br/>[1] Standard Errors assume that the covariance matrix of the errors is correctly specified."
      ],
      "text/latex": [
       "\\begin{center}\n",
       "\\begin{tabular}{lclc}\n",
       "\\toprule\n",
       "\\textbf{Dep. Variable:}    &        薪水        & \\textbf{  R-squared:         } &     0.855   \\\\\n",
       "\\textbf{Model:}            &       OLS        & \\textbf{  Adj. R-squared:    } &     0.854   \\\\\n",
       "\\textbf{Method:}           &  Least Squares   & \\textbf{  F-statistic:       } &     578.5   \\\\\n",
       "\\textbf{Date:}             & Tue, 23 Apr 2024 & \\textbf{  Prob (F-statistic):} &  6.69e-43   \\\\\n",
       "\\textbf{Time:}             &     15:02:22     & \\textbf{  Log-Likelihood:    } &   -930.83   \\\\\n",
       "\\textbf{No. Observations:} &         100      & \\textbf{  AIC:               } &     1866.   \\\\\n",
       "\\textbf{Df Residuals:}     &          98      & \\textbf{  BIC:               } &     1871.   \\\\\n",
       "\\textbf{Df Model:}         &           1      & \\textbf{                     } &             \\\\\n",
       "\\textbf{Covariance Type:}  &    nonrobust     & \\textbf{                     } &             \\\\\n",
       "\\bottomrule\n",
       "\\end{tabular}\n",
       "\\begin{tabular}{lcccccc}\n",
       "               & \\textbf{coef} & \\textbf{std err} & \\textbf{t} & \\textbf{P$> |$t$|$} & \\textbf{[0.025} & \\textbf{0.975]}  \\\\\n",
       "\\midrule\n",
       "\\textbf{const} &    1.014e+04  &      507.633     &    19.981  &         0.000        &     9135.751    &     1.12e+04     \\\\\n",
       "\\textbf{工龄}    &    2497.1513  &      103.823     &    24.052  &         0.000        &     2291.118    &     2703.185     \\\\\n",
       "\\bottomrule\n",
       "\\end{tabular}\n",
       "\\begin{tabular}{lclc}\n",
       "\\textbf{Omnibus:}       &  0.287 & \\textbf{  Durbin-Watson:     } &    0.555  \\\\\n",
       "\\textbf{Prob(Omnibus):} &  0.867 & \\textbf{  Jarque-Bera (JB):  } &    0.463  \\\\\n",
       "\\textbf{Skew:}          &  0.007 & \\textbf{  Prob(JB):          } &    0.793  \\\\\n",
       "\\textbf{Kurtosis:}      &  2.667 & \\textbf{  Cond. No.          } &     9.49  \\\\\n",
       "\\bottomrule\n",
       "\\end{tabular}\n",
       "%\\caption{OLS Regression Results}\n",
       "\\end{center}\n",
       "\n",
       "Notes: \\newline\n",
       " [1] Standard Errors assume that the covariance matrix of the errors is correctly specified."
      ],
      "text/plain": [
       "<class 'statsmodels.iolib.summary.Summary'>\n",
       "\"\"\"\n",
       "                            OLS Regression Results                            \n",
       "==============================================================================\n",
       "Dep. Variable:                     薪水   R-squared:                       0.855\n",
       "Model:                            OLS   Adj. R-squared:                  0.854\n",
       "Method:                 Least Squares   F-statistic:                     578.5\n",
       "Date:                Tue, 23 Apr 2024   Prob (F-statistic):           6.69e-43\n",
       "Time:                        15:02:22   Log-Likelihood:                -930.83\n",
       "No. Observations:                 100   AIC:                             1866.\n",
       "Df Residuals:                      98   BIC:                             1871.\n",
       "Df Model:                           1                                         \n",
       "Covariance Type:            nonrobust                                         \n",
       "==============================================================================\n",
       "                 coef    std err          t      P>|t|      [0.025      0.975]\n",
       "------------------------------------------------------------------------------\n",
       "const       1.014e+04    507.633     19.981      0.000    9135.751    1.12e+04\n",
       "工龄          2497.1513    103.823     24.052      0.000    2291.118    2703.185\n",
       "==============================================================================\n",
       "Omnibus:                        0.287   Durbin-Watson:                   0.555\n",
       "Prob(Omnibus):                  0.867   Jarque-Bera (JB):                0.463\n",
       "Skew:                           0.007   Prob(JB):                        0.793\n",
       "Kurtosis:                       2.667   Cond. No.                         9.49\n",
       "==============================================================================\n",
       "\n",
       "Notes:\n",
       "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n",
       "\"\"\""
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import statsmodels.api as sm\n",
    "X2 = sm.add_constant(X)\n",
    "est = sm.OLS(Y, X2).fit()\n",
    "est.summary()  # 在非Jupyter Notebook的编辑器中需要写成print(est.summary())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 如果设置成一元二次方程，来看下模型评估效果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table class=\"simpletable\">\n",
       "<caption>OLS Regression Results</caption>\n",
       "<tr>\n",
       "  <th>Dep. Variable:</th>           <td>薪水</td>        <th>  R-squared:         </th> <td>   0.931</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Model:</th>                   <td>OLS</td>       <th>  Adj. R-squared:    </th> <td>   0.930</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Method:</th>             <td>Least Squares</td>  <th>  F-statistic:       </th> <td>   654.8</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Date:</th>             <td>Tue, 23 Apr 2024</td> <th>  Prob (F-statistic):</th> <td>4.70e-57</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Time:</th>                 <td>15:05:15</td>     <th>  Log-Likelihood:    </th> <td> -893.72</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>No. Observations:</th>      <td>   100</td>      <th>  AIC:               </th> <td>   1793.</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Df Residuals:</th>          <td>    97</td>      <th>  BIC:               </th> <td>   1801.</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Df Model:</th>              <td>     2</td>      <th>                     </th>     <td> </td>   \n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Covariance Type:</th>      <td>nonrobust</td>    <th>                     </th>     <td> </td>   \n",
       "</tr>\n",
       "</table>\n",
       "<table class=\"simpletable\">\n",
       "<tr>\n",
       "    <td></td>       <th>coef</th>     <th>std err</th>      <th>t</th>      <th>P>|t|</th>  <th>[0.025</th>    <th>0.975]</th>  \n",
       "</tr>\n",
       "<tr>\n",
       "  <th>const</th> <td> 1.399e+04</td> <td>  512.264</td> <td>   27.307</td> <td> 0.000</td> <td>  1.3e+04</td> <td>  1.5e+04</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>x1</th>    <td> -743.6808</td> <td>  321.809</td> <td>   -2.311</td> <td> 0.023</td> <td>-1382.383</td> <td> -104.979</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>x2</th>    <td>  400.8040</td> <td>   38.790</td> <td>   10.333</td> <td> 0.000</td> <td>  323.816</td> <td>  477.792</td>\n",
       "</tr>\n",
       "</table>\n",
       "<table class=\"simpletable\">\n",
       "<tr>\n",
       "  <th>Omnibus:</th>       <td> 2.440</td> <th>  Durbin-Watson:     </th> <td>   1.137</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Prob(Omnibus):</th> <td> 0.295</td> <th>  Jarque-Bera (JB):  </th> <td>   2.083</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Skew:</th>          <td>-0.352</td> <th>  Prob(JB):          </th> <td>   0.353</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Kurtosis:</th>      <td> 3.063</td> <th>  Cond. No.          </th> <td>    102.</td>\n",
       "</tr>\n",
       "</table><br/><br/>Notes:<br/>[1] Standard Errors assume that the covariance matrix of the errors is correctly specified."
      ],
      "text/latex": [
       "\\begin{center}\n",
       "\\begin{tabular}{lclc}\n",
       "\\toprule\n",
       "\\textbf{Dep. Variable:}    &        薪水        & \\textbf{  R-squared:         } &     0.931   \\\\\n",
       "\\textbf{Model:}            &       OLS        & \\textbf{  Adj. R-squared:    } &     0.930   \\\\\n",
       "\\textbf{Method:}           &  Least Squares   & \\textbf{  F-statistic:       } &     654.8   \\\\\n",
       "\\textbf{Date:}             & Tue, 23 Apr 2024 & \\textbf{  Prob (F-statistic):} &  4.70e-57   \\\\\n",
       "\\textbf{Time:}             &     15:05:15     & \\textbf{  Log-Likelihood:    } &   -893.72   \\\\\n",
       "\\textbf{No. Observations:} &         100      & \\textbf{  AIC:               } &     1793.   \\\\\n",
       "\\textbf{Df Residuals:}     &          97      & \\textbf{  BIC:               } &     1801.   \\\\\n",
       "\\textbf{Df Model:}         &           2      & \\textbf{                     } &             \\\\\n",
       "\\textbf{Covariance Type:}  &    nonrobust     & \\textbf{                     } &             \\\\\n",
       "\\bottomrule\n",
       "\\end{tabular}\n",
       "\\begin{tabular}{lcccccc}\n",
       "               & \\textbf{coef} & \\textbf{std err} & \\textbf{t} & \\textbf{P$> |$t$|$} & \\textbf{[0.025} & \\textbf{0.975]}  \\\\\n",
       "\\midrule\n",
       "\\textbf{const} &    1.399e+04  &      512.264     &    27.307  &         0.000        &      1.3e+04    &      1.5e+04     \\\\\n",
       "\\textbf{x1}    &    -743.6808  &      321.809     &    -2.311  &         0.023        &    -1382.383    &     -104.979     \\\\\n",
       "\\textbf{x2}    &     400.8040  &       38.790     &    10.333  &         0.000        &      323.816    &      477.792     \\\\\n",
       "\\bottomrule\n",
       "\\end{tabular}\n",
       "\\begin{tabular}{lclc}\n",
       "\\textbf{Omnibus:}       &  2.440 & \\textbf{  Durbin-Watson:     } &    1.137  \\\\\n",
       "\\textbf{Prob(Omnibus):} &  0.295 & \\textbf{  Jarque-Bera (JB):  } &    2.083  \\\\\n",
       "\\textbf{Skew:}          & -0.352 & \\textbf{  Prob(JB):          } &    0.353  \\\\\n",
       "\\textbf{Kurtosis:}      &  3.063 & \\textbf{  Cond. No.          } &     102.  \\\\\n",
       "\\bottomrule\n",
       "\\end{tabular}\n",
       "%\\caption{OLS Regression Results}\n",
       "\\end{center}\n",
       "\n",
       "Notes: \\newline\n",
       " [1] Standard Errors assume that the covariance matrix of the errors is correctly specified."
      ],
      "text/plain": [
       "<class 'statsmodels.iolib.summary.Summary'>\n",
       "\"\"\"\n",
       "                            OLS Regression Results                            \n",
       "==============================================================================\n",
       "Dep. Variable:                     薪水   R-squared:                       0.931\n",
       "Model:                            OLS   Adj. R-squared:                  0.930\n",
       "Method:                 Least Squares   F-statistic:                     654.8\n",
       "Date:                Tue, 23 Apr 2024   Prob (F-statistic):           4.70e-57\n",
       "Time:                        15:05:15   Log-Likelihood:                -893.72\n",
       "No. Observations:                 100   AIC:                             1793.\n",
       "Df Residuals:                      97   BIC:                             1801.\n",
       "Df Model:                           2                                         \n",
       "Covariance Type:            nonrobust                                         \n",
       "==============================================================================\n",
       "                 coef    std err          t      P>|t|      [0.025      0.975]\n",
       "------------------------------------------------------------------------------\n",
       "const       1.399e+04    512.264     27.307      0.000     1.3e+04     1.5e+04\n",
       "x1          -743.6808    321.809     -2.311      0.023   -1382.383    -104.979\n",
       "x2           400.8040     38.790     10.333      0.000     323.816     477.792\n",
       "==============================================================================\n",
       "Omnibus:                        2.440   Durbin-Watson:                   1.137\n",
       "Prob(Omnibus):                  0.295   Jarque-Bera (JB):                2.083\n",
       "Skew:                          -0.352   Prob(JB):                        0.353\n",
       "Kurtosis:                       3.063   Cond. No.                         102.\n",
       "==============================================================================\n",
       "\n",
       "Notes:\n",
       "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n",
       "\"\"\""
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "poly_reg = PolynomialFeatures(degree=2)\n",
    "X_ = poly_reg.fit_transform(X)\n",
    "\n",
    "import statsmodels.api as sm\n",
    "X2 = sm.add_constant(X_)  # 这里传入的是含有x^2的X_\n",
    "est = sm.OLS(Y, X2).fit()\n",
    "est.summary()  # 在非Jupyter Notebook的编辑器中需要写成print(est.summary())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到模型效果的确有所提升"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**补充知识点：另一种获取R-squared值的代码实现**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {color: black;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LinearRegression()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">LinearRegression</label><div class=\"sk-toggleable__content\"><pre>LinearRegression()</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "LinearRegression()"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 1.读取数据\n",
    "import pandas\n",
    "df = pandas.read_excel('IT行业收入表.xlsx')\n",
    "X = df[['工龄']]\n",
    "Y = df['薪水']\n",
    "\n",
    "# 2.模型训练\n",
    "from sklearn.linear_model import LinearRegression\n",
    "regr = LinearRegression()\n",
    "regr.fit(X,Y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8551365584870814\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import r2_score\n",
    "r2 = r2_score(Y, regr.predict(X))\n",
    "print(r2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到和之前通过statsmodels库评估的结果是一致的。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
